home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / share / system-config-printer / AdvancedServerSettings.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-10-12  |  11.0 KB  |  378 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. from gettext import gettext as _
  5. import gobject
  6. import gtk
  7. import os
  8. import tempfile
  9. import time
  10. from errordialogs import *
  11.  
  12. class AdvancedServerSettingsDialog:
  13.     RESOURCE = '/admin/conf/cupsd.conf'
  14.     
  15.     def __init__(self, cupsconn, parent = None, on_apply = None):
  16.         self.cupsconn = cupsconn
  17.         self.on_apply = on_apply
  18.         self.handler_ids = { }
  19.         dialog = gtk.Dialog(_('Advanced Server Settings'), parent, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OK, gtk.RESPONSE_OK))
  20.         dialog.set_default_response(gtk.RESPONSE_OK)
  21.         dialog.set_border_width(6)
  22.         dialog.set_resizable(False)
  23.         dialog.set_has_separator(False)
  24.         self.connect(dialog, 'response', self.on_response)
  25.         self.dialog = dialog
  26.         frames_vbox = gtk.VBox(False, 6)
  27.         dialog.vbox.pack_start(frames_vbox, False, False, 0)
  28.         history_frame = gtk.Frame()
  29.         label = gtk.Label('<b>' + _('Job History') + '</b>')
  30.         label.set_use_markup(True)
  31.         history_frame.set_label_widget(label)
  32.         history_frame.set_shadow_type(gtk.SHADOW_NONE)
  33.         frames_vbox.pack_start(history_frame, False, False, 0)
  34.         align = gtk.Alignment(0.5, 0.5, 1, 1)
  35.         align.set_padding(0, 0, 12, 0)
  36.         history_frame.add(align)
  37.         vbox = gtk.VBox(False, 0)
  38.         align.add(vbox)
  39.         rb1 = gtk.RadioButton(None, _('Do not preserve job history'), False)
  40.         self.rbPreserveJobNone = rb1
  41.         rb2 = gtk.RadioButton(rb1, _('Preserve job history but not files'), False)
  42.         self.rbPreserveJobHistory = rb2
  43.         rb3 = gtk.RadioButton(rb1, _('Preserve job files (allow reprinting)'), False)
  44.         self.rbPreserveJobFiles = rb3
  45.         vbox.pack_start(rb1, False, False, 0)
  46.         vbox.pack_start(rb2, False, False, 0)
  47.         vbox.pack_start(rb3, False, False, 0)
  48.         browse_frame = gtk.Frame()
  49.         label = gtk.Label('<b>' + _('Browse Servers') + '</b>')
  50.         label.set_use_markup(True)
  51.         browse_frame.set_label_widget(label)
  52.         browse_frame.set_shadow_type(gtk.SHADOW_NONE)
  53.         frames_vbox.pack_start(browse_frame, False, False, 0)
  54.         align = gtk.Alignment(0.5, 0.5, 1, 1)
  55.         align.set_padding(0, 0, 12, 0)
  56.         browse_frame.add(align)
  57.         vbox = gtk.VBox(False, 6)
  58.         align.add(vbox)
  59.         label = gtk.Label(_('Usually print servers broadcast their queues.  Specify print servers below to periodically ask for queues instead.'))
  60.         label.set_line_wrap(True)
  61.         vbox.pack_start(label, False, False, 0)
  62.         hbox = gtk.HBox(False, 6)
  63.         vbox.pack_start(hbox, False, False, 0)
  64.         scrollwin = gtk.ScrolledWindow()
  65.         scrollwin.set_shadow_type(gtk.SHADOW_IN)
  66.         scrollwin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
  67.         hbox.pack_start(scrollwin, True, True, 0)
  68.         treeview = gtk.TreeView()
  69.         treeview.set_headers_visible(False)
  70.         scrollwin.add(treeview)
  71.         selection = treeview.get_selection()
  72.         selection.set_mode(gtk.SELECTION_MULTIPLE)
  73.         self.connect(selection, 'changed', self.on_treeview_selection_changed)
  74.         col = gtk.TreeViewColumn('', gtk.CellRendererText(), text = 0)
  75.         treeview.append_column(col)
  76.         self.browse_treeview = treeview
  77.         bb = gtk.VButtonBox()
  78.         bb.set_layout(gtk.BUTTONBOX_START)
  79.         hbox.pack_start(bb, False, False, 0)
  80.         add = gtk.Button(stock = gtk.STOCK_ADD)
  81.         bb.add(add)
  82.         self.connect(add, 'clicked', self.on_add_clicked)
  83.         self.add = add
  84.         remove = gtk.Button(stock = gtk.STOCK_REMOVE)
  85.         remove.set_sensitive(False)
  86.         bb.add(remove)
  87.         self.connect(remove, 'clicked', self.on_remove_clicked)
  88.         self.remove = remove
  89.         f = tempfile.TemporaryFile()
  90.         
  91.         try:
  92.             cupsconn.getFile(self.RESOURCE, file = f)
  93.         except cups.HTTPError:
  94.             s = None
  95.             show_HTTP_Error(s, dialog)
  96.             raise 
  97.  
  98.         
  99.         def parse_yesno(line):
  100.             arg1 = line.split(' ')[1].strip()
  101.             if arg1 in ('true', 'on', 'enabled', 'yes'):
  102.                 return True
  103.             if arg1 in ('false', 'off', 'disabled', 'no', '0'):
  104.                 return False
  105.             
  106.             try:
  107.                 if int(arg1) != 0:
  108.                     return True
  109.             except:
  110.                 arg1 in ('false', 'off', 'disabled', 'no', '0')
  111.                 arg1 in ('true', 'on', 'enabled', 'yes')
  112.  
  113.             raise RuntimeError
  114.  
  115.         preserve_job_history = True
  116.         preserve_job_files = False
  117.         browsing = True
  118.         self.browse_poll = []
  119.         f.seek(0)
  120.         for line in f.readlines():
  121.             l = line.lower()
  122.             if l.startswith('preservejobhistory '):
  123.                 
  124.                 try:
  125.                     preserve_job_history = parse_yesno(l)
  126.  
  127.                 continue
  128.             if l.startswith('preservejobfiles '):
  129.                 
  130.                 try:
  131.                     preserve_job_files = parse_yesno(l)
  132.  
  133.                 continue
  134.             if l.startswith('browsing '):
  135.                 
  136.                 try:
  137.                     browsing = parse_yesno(l)
  138.  
  139.                 continue
  140.             if l.startswith('browsepoll '):
  141.                 self.browse_poll.append(line[len('browsepoll '):].strip())
  142.                 continue
  143.         
  144.         if not browsing:
  145.             browse_frame.set_sensitive(False)
  146.         
  147.         if preserve_job_files:
  148.             self.rbPreserveJobFiles.set_active(True)
  149.         elif preserve_job_history:
  150.             self.rbPreserveJobHistory.set_active(True)
  151.         else:
  152.             self.rbPreserveJobNone.set_active(True)
  153.         self.preserve_job_history = preserve_job_history
  154.         self.preserve_job_files = preserve_job_files
  155.         model = gtk.ListStore(gobject.TYPE_STRING)
  156.         treeview.set_model(model)
  157.         for server in self.browse_poll:
  158.             model.append(row = [
  159.                 server])
  160.         
  161.         dialog.show_all()
  162.  
  163.     
  164.     def connect(self, widget, signal, handler, reason = None):
  165.         id = widget.connect(signal, handler)
  166.         if not self.handler_ids.has_key(reason):
  167.             self.handler_ids[reason] = []
  168.         
  169.         self.handler_ids[reason].append((widget, id))
  170.  
  171.     
  172.     def disconnect(self, reason = None):
  173.         for widget, id in self.handler_ids[reason]:
  174.             widget.disconnect(id)
  175.         
  176.         del self.handler_ids[reason]
  177.  
  178.     
  179.     def __del__(self):
  180.         self.dialog.destroy()
  181.  
  182.     
  183.     def on_treeview_selection_changed(self, selection):
  184.         self.remove.set_sensitive(selection.count_selected_rows() != 0)
  185.  
  186.     
  187.     def on_add_clicked(self, button):
  188.         model = self.browse_treeview.get_model()
  189.         iter = model.insert(0, row = [
  190.             _('Enter IP address')])
  191.         button.set_sensitive(False)
  192.         col = self.browse_treeview.get_columns()[0]
  193.         cell = col.get_cell_renderers()[0]
  194.         cell.set_property('editable', True)
  195.         self.browse_treeview.set_cursor((0,), col, start_editing = True)
  196.         self.connect(cell, 'edited', self.on_browse_poll_edited, 'edit')
  197.         self.connect(cell, 'editing-canceled', self.on_browse_poll_edit_cancel, 'edit')
  198.  
  199.     
  200.     def on_browse_poll_edited(self, cell, path, newvalue):
  201.         model = self.browse_treeview.get_model()
  202.         iter = model.get_iter(path)
  203.         model.set_value(iter, 0, newvalue)
  204.         cell.stop_editing(canceled = False)
  205.         cell.set_property('editable', False)
  206.         self.add.set_sensitive(True)
  207.         self.disconnect('edit')
  208.         valid = True
  209.         if newvalue.find(' ') != -1:
  210.             valid = False
  211.         else:
  212.             count = 0
  213.             i = model.get_iter_first()
  214.             while i:
  215.                 if model.get_value(i, 0) == newvalue:
  216.                     count += 1
  217.                     if count == 2:
  218.                         valid = False
  219.                         selection = self.browse_treeview.get_selection()
  220.                         selection.select_iter(i)
  221.                         break
  222.                     
  223.                 
  224.                 i = model.iter_next(i)
  225.         if not valid:
  226.             model.remove(iter)
  227.         
  228.  
  229.     
  230.     def on_browse_poll_edit_cancel(self, cell):
  231.         cell.stop_editing(canceled = True)
  232.         cell.set_property('editable', False)
  233.         model = self.browse_treeview.get_model()
  234.         iter = model.get_iter((0,))
  235.         model.remove(iter)
  236.         self.add.set_sensitive(True)
  237.         self.remove.set_sensitive(False)
  238.         self.disconnect('edit')
  239.  
  240.     
  241.     def on_remove_clicked(self, button):
  242.         model = self.browse_treeview.get_model()
  243.         selection = self.browse_treeview.get_selection()
  244.         rows = selection.get_selected_rows()
  245.         refs = (map,)((lambda path: gtk.TreeRowReference(model, path)), rows[1])
  246.         for ref in refs:
  247.             path = ref.get_path()
  248.             iter = model.get_iter(path)
  249.             model.remove(iter)
  250.         
  251.  
  252.     
  253.     def on_response(self, dialog, response):
  254.         if response == gtk.RESPONSE_CANCEL or response != gtk.RESPONSE_OK:
  255.             self.disconnect()
  256.             del self
  257.             return None
  258.         preserve_job_files = self.rbPreserveJobFiles.get_active()
  259.         if not preserve_job_files:
  260.             pass
  261.         preserve_job_history = self.rbPreserveJobHistory.get_active()
  262.         model = self.browse_treeview.get_model()
  263.         browse_poll = []
  264.         iter = model.get_iter_first()
  265.         while iter:
  266.             browse_poll.append(model.get_value(iter, 0))
  267.             iter = model.iter_next(iter)
  268.             continue
  269.             response != gtk.RESPONSE_OK
  270.         if set(browse_poll) == set(self.browse_poll) and preserve_job_files == self.preserve_job_files and preserve_job_history == self.preserve_job_history:
  271.             self.disconnect()
  272.             del self
  273.             return None
  274.         f = tempfile.TemporaryFile()
  275.         
  276.         try:
  277.             self.cupsconn.getFile(self.RESOURCE, file = f)
  278.         except cups.HTTPError:
  279.             preserve_job_history == self.preserve_job_history
  280.             s = preserve_job_history == self.preserve_job_history
  281.             show_HTTP_Error(s, dialog)
  282.             return None
  283.  
  284.         if preserve_job_files:
  285.             job_files_line = 'PreserveJobFiles Yes\n'
  286.         
  287.         for server in browse_poll:
  288.             browsepoll_lines += 'BrowsePoll %s\n' % server
  289.         
  290.         f.seek(0)
  291.         conf = tempfile.TemporaryFile()
  292.         wrote_preserve_history = wrote_preserve_files = False
  293.         wrote_browsepoll = False
  294.         has_browsepoll = False
  295.         lines = f.readlines()
  296.         for line in lines:
  297.             l = line.lower().strip()
  298.             if l.startswith('browsepoll '):
  299.                 has_browsepoll = True
  300.                 break
  301.                 continue
  302.         
  303.         for line in lines:
  304.             l = line.lower().strip()
  305.             if l.startswith('preservejobhistory '):
  306.                 if wrote_preserve_history:
  307.                     continue
  308.                 
  309.                 line = job_history_line
  310.                 wrote_preserve_history = True
  311.             elif l.startswith('preservejobfiles '):
  312.                 if wrote_preserve_files:
  313.                     continue
  314.                 
  315.                 line = job_files_line
  316.                 wrote_preserve_files = True
  317.             elif has_browsepoll and l.startswith('browsepoll '):
  318.                 if wrote_browsepoll:
  319.                     continue
  320.                 
  321.                 conf.write(browsepoll_lines)
  322.                 wrote_browsepoll = True
  323.                 continue
  324.             elif not has_browsepoll and l.startswith('browsing '):
  325.                 if not wrote_browsepoll:
  326.                     conf.write(line)
  327.                     conf.write(browsepoll_lines)
  328.                     wrote_browsepoll = True
  329.                     continue
  330.                 
  331.             
  332.             conf.write(line)
  333.         
  334.         if not wrote_preserve_history:
  335.             conf.write(job_history_line)
  336.         
  337.         if not wrote_preserve_files:
  338.             conf.write(job_files_line)
  339.         
  340.         if not wrote_browsepoll:
  341.             conf.write(browsepoll_lines)
  342.         
  343.         conf.flush()
  344.         fd = conf.fileno()
  345.         os.lseek(fd, 0, os.SEEK_SET)
  346.         
  347.         try:
  348.             self.cupsconn.putFile('/admin/conf/cupsd.conf', fd = fd)
  349.         except cups.HTTPError:
  350.             s = None
  351.             show_HTTP_Error(s, dialog)
  352.             return None
  353.  
  354.         time.sleep(1)
  355.         
  356.         try:
  357.             attempt = 1
  358.             while attempt <= 5:
  359.                 
  360.                 try:
  361.                     self.cupsconn._connect()
  362.                 continue
  363.                 except RuntimeError:
  364.                     time.sleep(1)
  365.                     attempt += 1
  366.                     continue
  367.                 
  368.  
  369.                 None<EXCEPTION MATCH>RuntimeError
  370.         except AttributeError:
  371.             pass
  372.  
  373.         self.disconnect()
  374.         self.on_apply()
  375.         del self
  376.  
  377.  
  378.